package Collection;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/19 20:23
 */

import org.junit.Test;

import java.util.*;

public class List {
    /**
     * ArrayList集合：
     * list接口下的一个类，是一个有序的集合，带索引(下标)的对象数组，提供了随机访问数据，
     * 遍历数据的时间（随机遍历get方法，for循环是最快的），迭代器最慢。
     * 它是一个非线程安全的类，做遍历较快
     * 用途：适用在对元素查询操作较频繁的时候
     * 特点：
     * - 有序
     * - 允许重复元素
     * - 线程不安全，删除，在特定未知插入元素都比较低效
     * - 底层会自动创建数组来存放对象，数组的初始容量是10
     */
    @Test
    public void TestArrayList() {//ArrayList集合
        ArrayList<String> list1 = new ArrayList<String>();//创建第一个ArrayList集合
        ArrayList<String> list2 = new ArrayList<String>();//创建第二个ArrayList集合
        list1.add("at1");
        list1.add("at2");
        list1.add("at2");
        list1.add("at4");
        list2.add("at5");
        list2.add("at5");
        list2.add("at6");
        //添加集合元素,允许添加重复元素
        System.out.println(list1);//打印ArrayList集合
        list1.set(0, "at0");//将指定下标位置改为指定的元素
        System.out.println(list1);//打印改完后的ArrayList集合
        System.out.println(list1.size());//返回ArrayList集合的容量(元素数)
        System.out.println(list1.get(2));//返回列表中指定位置的元素，指定的位置使用的是下标，下标超过集合最大下标就会出现数组下标越界异常
        list1.add(4, "at5");//在指定位置(下标)添加指定元素，下标最大只能为ArrayList集合的最大下标位置+1，否则会报错
        System.out.println(list1);//打印添加指定位置的指定元素的ArrayList集合
        System.out.println(list1.isEmpty());//判断ArrayList集合中是否还包含元素，为空则返回true
        System.out.println(list1.contains("at2"));//判断ArrayList集合是否包含指定元素，包含则返回true
        System.out.println(list1.indexOf("at2"));//查找ArrayList集合顺序查找时第一次出现时的指定元素，查找成功返回指定元素的下标，否则返回-1
        System.out.println(list1.lastIndexOf("at2"));//查找ArrayList集合逆序查找时第一次出现时的指定元素，查找成功返回指定元素的下标，否则返回-1
        System.out.println(list1.remove(4));//移除ArrayList集合指定位置的元素，指定位置采用的是下标，并返回被删的元素
        System.out.println(list1);//移除指定位置后的ArrayList集合
        System.out.println(list1.remove("at2"));//移除ArrayList集合第一次出现时的指定元素，移除成功返回true
        System.out.println(list1);//移除ArrayList集合第一次出现的指定元素后的集合
        list1.addAll(list2);//在ArrayList集合中添加指定ArrayList集合中的所有元素
        System.out.println(list1);//打印添加指定ArrayList集合后的ArrayList集合
        java.util.List<String> result = list1.subList(0, 5);//在原ArrayList集合中截取子集合，截取区间为[开始下标，结束下标)
        System.out.println(result);//打印截取后的ArrayList集合
        Iterator<String> it = list1.iterator();//返回按适当顺序在ArrayList集合的元素上进行迭代的迭代器
    }

    @Test
    public void TestLinkedList() {
        LinkedList<String> llist = new LinkedList<>();
        llist.offer("asdf1");//新增元素
        llist.offer("asdf2");//新增元素
        llist.offer("asdf3");//新增元素
        llist.offer("asdf4");//新增元素
        llist.offerFirst("asdf0");//新增首元素
        llist.offerLast("asdf_end");//新增尾元素
        //获取但不移除集合中的首元素
        System.out.println(llist.element());
        System.out.println(llist.peek());
        System.out.println(llist.peekFirst());
        //获取但不移除集合中的尾元素
        System.out.println(llist.peekLast());
        llist.poll();//移除首元素
        llist.pollFirst();//移除首元素
        llist.pollLast();//移除尾元素
        llist.addAll(new ArrayList<>());//在集合里添加一个空集合
        llist.add(0, "5");//将五添加到第一个
        llist.clear();//清除集合
        //list.ensureCapacity(minCapacity);改变集合长度
        llist.add("asdf5");
        llist.add("asdf6");
        llist.add("5");
        llist.remove(2);//删除第二个集合元素，使用的下标
        llist.remove("5");//删除5,没有则不用删除
        llist.set(1, "2");//将第一个数修改为2
        System.out.println(llist);
    }
}
